package view;

import model.User;
import service.UserService;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.util.Map;



//温烁

// PersonalInfoPanel类继承自JPanel，用于展示和编辑用户的个人信息，包含姓名、性别、电话、邮箱等信息的显示与修改功能
public class PersonalInfoPanel extends JPanel {
    // 标题字体，设置为微软雅黑、加粗、字号14
    private static final Font TITLE_FONT = new Font("微软雅黑", Font.BOLD, 14);
    // 内容字体，设置为微软雅黑、常规、字号13，用于文本框、标签等组件显示文字的字体设置
    private static final Font CONTENT_FONT = new Font("微软雅黑", Font.PLAIN, 13);
    // 按钮字体，设置为微软雅黑、常规、字号13，用于按钮上文字的字体设置
    private static final Font BUTTON_FONT = new Font("微软雅黑", Font.PLAIN, 13);

    // 用户服务类的实例，用于调用与用户相关的业务逻辑，比如获取和更新用户信息等操作
    private UserService userService;
    // 当前登录的用户对象，代表正在操作个人信息的这个用户
    private User currentUser;
    // 用于显示和编辑用户姓名的文本框组件
    private JTextField nameField;
    // 用于选择用户性别的下拉框组件
    private JComboBox<String> genderCombo;
    // 用于显示和编辑用户电话号码的文本框组件
    private JTextField phoneField;
    // 用于显示和编辑用户邮箱的文本框组件
    private JTextField emailField;

    // 构造方法，接收一个User对象作为参数，用于初始化当前用户信息，并进行组件的初始化和加载用户已有信息的操作
    public PersonalInfoPanel(User user) {
        this.currentUser = user;
        // 实例化用户服务类，用于后续获取和更新用户信息等操作
        this.userService = new UserService();
        initComponents();
        loadUserInfo();
    }

    // 初始化界面组件的方法，包括设置布局、创建各种面板、添加输入组件以及按钮等，并设置相关的样式和事件监听
    private void initComponents() {
        // 设置PersonalInfoPanel的布局为BorderLayout，水平和垂直间距为10像素
        setLayout(new BorderLayout(10, 10));
        // 设置PersonalInfoPanel的边框为一个空边框，四周内边距均为20像素
        setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

        // 设置Swing界面中全局的字体，将不同类型组件（标签、文本框、下拉框、按钮）的字体进行统一设置
        UIManager.put("Label.font", CONTENT_FONT);
        UIManager.put("TextField.font", CONTENT_FONT);
        UIManager.put("ComboBox.font", CONTENT_FONT);
        UIManager.put("Button.font", BUTTON_FONT);

        // 创建主面板，布局为BorderLayout，水平和垂直间距为10像素，用于承载表单面板和按钮面板等主要内容
        JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
        mainPanel.setBorder(BorderFactory.createTitledBorder(
                BorderFactory.createEtchedBorder(),
                "个人信息",
                TitledBorder.LEFT,
                TitledBorder.TOP,
                TITLE_FONT
        ));

        // 创建表单面板，布局采用GridBagLayout，用于按规则排列各个输入组件（姓名、性别等），并设置了边框的内边距
        JPanel formPanel = new JPanel(new GridBagLayout());
        formPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.fill = GridBagConstraints.HORIZONTAL;

        // 创建输入组件，分别是姓名、性别、电话、邮箱对应的文本框或下拉框组件
        nameField = new JTextField(20);
        genderCombo = new JComboBox<>(new String[]{"男", "女"});
        phoneField = new JTextField(20);
        emailField = new JTextField(20);

        // 设置各个输入组件的首选大小，使其在界面上显示时具有统一的尺寸
        Dimension fieldSize = new Dimension(200, 25);
        nameField.setPreferredSize(fieldSize);
        genderCombo.setPreferredSize(fieldSize);
        phoneField.setPreferredSize(fieldSize);
        emailField.setPreferredSize(fieldSize);

        // 将各个输入组件添加到表单面板中，按照一定的顺序和布局规则排列
        int row = 0;
        addFormField(formPanel, "姓名：", nameField, gbc, row++);
        addFormField(formPanel, "性别：", genderCombo, gbc, row++);
        addFormField(formPanel, "电话：", phoneField, gbc, row++);
        addFormField(formPanel, "邮箱：", emailField, gbc, row++);

        mainPanel.add(formPanel, BorderLayout.CENTER);

        // 创建按钮面板，布局为FlowLayout，使按钮在面板中居中排列，水平和垂直间距为10像素
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
        JButton saveButton = new JButton("保存");
        JButton resetButton = new JButton("重置");

        // 设置按钮的首选大小，使其在界面上显示时具有合适统一的尺寸
        Dimension buttonSize = new Dimension(90, 30);
        saveButton.setPreferredSize(buttonSize);
        resetButton.setPreferredSize(buttonSize);

        // 设置按钮的字体，应用之前定义好的按钮字体样式
        saveButton.setFont(BUTTON_FONT);
        resetButton.setFont(BUTTON_FONT);

        // 为保存按钮添加事件监听器，点击时调用saveUserInfo方法来保存用户修改后的信息
        saveButton.addActionListener(e -> saveUserInfo());
        // 为重置按钮添加事件监听器，点击时调用loadUserInfo方法来重新加载用户原有的信息，恢复界面显示
        resetButton.addActionListener(e -> loadUserInfo());

        buttonPanel.add(saveButton);
        buttonPanel.add(resetButton);
        mainPanel.add(buttonPanel, BorderLayout.SOUTH);

        add(mainPanel, BorderLayout.CENTER);
    }

    // 辅助方法，用于将一个标签和对应的输入组件按照指定的布局约束（GridBagConstraints）添加到给定的面板中
    private void addFormField(JPanel panel, String label, JComponent field,
                              GridBagConstraints gbc, int row) {
        gbc.gridx = 0;
        gbc.gridy = row;
        gbc.anchor = GridBagConstraints.EAST;
        panel.add(new JLabel(label), gbc);

        gbc.gridx = 1;
        gbc.anchor = GridBagConstraints.WEST;
        panel.add(field, gbc);
    }

    // 从用户服务类中获取当前用户的个人信息，并将相应信息填充到界面的各个输入组件中，用于显示用户已有的信息
    private void loadUserInfo() {
        Map<String, String> info = userService.getPersonalInfo(currentUser.getId());
        nameField.setText(info.get("name"));
        genderCombo.setSelectedItem(info.get("gender"));
        phoneField.setText(info.get("phone"));
        emailField.setText(info.get("email"));
    }

    // 获取界面上各个输入组件中用户输入或选择的信息，封装成一个Map，然后通过用户服务类尝试更新用户的个人信息，
    // 如果更新成功则弹出提示框显示“保存成功！”
    private void saveUserInfo() {
        Map<String, String> info = Map.of(
                "name", nameField.getText().trim(),
                "gender", (String) genderCombo.getSelectedItem(),
                "phone", phoneField.getText().trim(),
                "email", emailField.getText().trim()
        );

        if (userService.updatePersonalInfo(currentUser.getId(), info)) {
            JOptionPane.showMessageDialog(this, "保存成功！");
        }
    }
}